package com.example.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test3 {
    public static void main(String[] args) throws Exception {
        // 已知：
        // 1.有一个类名为User的类
        // 2.符合javabean规范。属性私有化，对外提供公开的setter和getter方法
        // 3.类当中有个属性，名字叫age
        // 4.age属性类型是int
        // 使用反射机制调用set方法，给age进行赋值

        // 方法名：setAge
        // set方法都是有参数的，属性和set方法的参数类型相同
/*获取类-->获取方法（需要方法名，set+A+ge）*/
        String className = "com.example.reflect.User";
        String propertyName = "age";
        // 获取类
        Class<?> clazz = Class.forName(className);
        // 获取方法名
        String setMethodName = "set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);

        /*知道属性名，可以获取属性，获取到属性，就可以知道属性的类型*/
        // 根据属性名获取属性类型，因为同一个类中属性名不可能相同
        Field field = clazz.getDeclaredField(propertyName);
        // 获取方法
        Method method = clazz.getDeclaredMethod(setMethodName,field.getType()); // field.getType()根据属性拿属性类型


//        // 获取方法  第四条可知是int类型
//        Method method = clazz.getDeclaredMethod(setMethodName,int.class);

        // 准备对象
        Object o = clazz.newInstance();
        // 调用方法
        method.invoke(o,20);
        System.out.println(o);
    }
}
